package Day_0228.TCPIP;

/**
 * @author zxc
 * @date 2023/02/28 19:33
 **/
public class TCPIP_CommunicationProcess {
    public static void main(String[] args) {
        /**
         * 请详细地谈一谈对于TCP/IP协议的通信过程
         * ===》
         * 一，通信过程中的重要概念
         * 1.主机 ：
         * ===>
         * 即，拥有自己MAC地址的设备;（由于是硬件设备，所以其是属于物理层）
         *
         * 2.MAC地址 ：
         * ===>
         * 即，每个硬件设备都有其专属的MAC地址;（MAC地址是用来标识某个硬件设备的唯一性;）
         *
         * 3.集线器 ：（物理层）
         * ===>
         * 即，在同一个子网内，能够将所要传输的数据包，从该子网内的某台设备 广播给该子网内的所有设备;
         *
         * 4.交换机 ：
         * ===》
         * 即，在同一个子网内，能够将所要传输的数据包，
         * 根据交换机所维护的 MAC地址和端口映射表，将其转发给指定MAC地址的设备;
         *
         * 5.MAC地址和端口映射表（MAC表） ：
         * ===》
         * （1）其是专属于集线器的，与集线器进行连接 是通过拥有MAC地址的设备和集线器中某个端口进行绑定;
         * （2）根据数据包中的目的MAC地址，集线器来决定要将该数据包 从哪个端口进行发送，才能够发送到目标MAC地址的设备;
         *
         * 6.IP地址 ：
         * ===》
         * （1）即，为虚拟地址，通过使用IP地址，来表示当前设备所在的子网;
         * （2）某台设备的IP地址 & 子网掩码，能够得到当前设备所处于的子网;
         * （3）即，若是两台设备之间要进行通信（即，数据包的传输） && 两台设备并不在同一个子网中，则需要经由路由器进行转发;
         *
         * 7.ARP缓存 ：
         * ===》
         * （1）ARP缓存，是存在于拥有MAC地址的设备，比如：主机设备，路由器等等;
         * （2）ARP缓存所存储的是，IP地址和MAC地址的映射表;
         * （3）若是不能够根据 目的IP地址，在ARP缓存中查询到对应的MAC地址的话，
         *  则发送方会在同一个子网内进行广播arp请求，具有目的IP地址的设备响应自身的MAC地址，同时及那个其保存到发送方的arp缓存中;
         *
         * 8.子网 ：
         * ===》
         * （1）IP地址 & 子网掩码所获取的结果，即为当前IP地址所对应设备的子网;
         * （2）由于交换机中某个端口是与路由器相连的，所以在该子网内包含了 所有主机 + 路由器与该子网相连的端口;
         *
         * 9.数据包的额外头部数据 ：
         * ===》
         * （1）数据链路层头部 ：其中包含了 源MAC地址 和 目的MAC地址;
         * 注意 ：数据链路层头部是在不断变化的，根据所在子网的不同，来对于数据包的数据链路层头部进行修改
         * 例如 ：
         * 主机A的MAC地址（1111） -> 该子网所对应的路由器A端口的MAC地址（2222）;
         * 路由器A中某个端口的MAC地址（3333） -> 路由器B中某个端口的MAC地址（4444）;
         * 主机B所在子网所对应的 路由器B端口MAC地址（5555） -> 主机B的MAC地址（6666）;
         * （2）网路层头部 ：其中包含了 源IP地址 和 目的IP地址;
         * 注意 ：网络层头部内容是不变的;
         *
         * 10.路由器 ：（网络层）
         * ===》
         * （1）即，路由器中每一个端口都有 其对应的MAC地址和IP地址 && 路由器每一个端口都对应的某个子网;
         * （2）路由器接收来自某个子网的数据包，根据自身维护的IP地址和端口映射表，寻找到数据包中所指定的IP地址所在子网的端口号
         * （3）若是路由器进行数据包转发到 另一个子网的时候，则需要将数据包的数据链路层头部进行重新封装;
         *  若是仅仅知道该子网所对应端口的MAC地址的话，还需要知道主机B的MAC地址，
         *  根据路由器中的arp缓存，来获取主机B的MAC地址;
         *  若是arp缓存中是不存在的话，则会从该子网所对应的MAC地址广播发送arp请求，来获取目的IP地址的MAC地址;
         *
         * 11.默认网关 ：
         * ===》
         * （1）即，若是某台设备A想要将数据包转发给设备B && 设备A和设备B的IP地址并不在同一个子网内，
         *  则选择将数据包发给默认网关的MAC地址;
         * （2）默认网关，即为 当前子网与路由器相连端口的IP地址;
         *
         * 12，IP地址和端口映射表 ：（路由表）
         * ===》
         * （1）即，由路由器维护的IP地址和端口映射表;
         * （2）路由表中，保存了 某个子网下的所有IP地址和端口之间的映射关系;
         * （3）即，获取目的IP地址，在路由器所维护的路由表中进行查询，来获取转发数据包的路由器端口
         *  同时，根据arp缓存，获取到该路由器端口的MAC地址;
         *
         * 二，通信的传输过程
         * 1.主机视角：
         * （1）首先要知道我的 IP 以及对方的 IP;
         * （2）通过子网掩码判断我们是否在同一个子网;
         * （3）在同一个子网就通过 arp 获取对方 mac 地址直接扔出去;
         * （4）不在同一个子网就通过 arp 获取默认网关的 mac 地址直接扔出去;
         *
         * 2.交换机视角：
         * （1）收到的数据包必须有目标 MAC 地址;
         * （2）通过 MAC 地址表查映射关系;
         * （3）查到了就按照映射关系从我的指定端口发出去;
         * （4）查不到就所有端口都发出去;
         *
         * 3.路由器视角：
         * （1）收到的数据包必须有目标 IP 地址;
         * （2）通过路由表查映射关系;
         * （3）查到了就按照映射关系从我的指定端口发出去（不在任何一个子网范围，走其路由器的默认网关也是查到了）
         * （4）查不到则返回一个路由不可达的数据包;
         * ===》
         * 网络层（IP协议）本身没有传输包的功能，包的实际传输是委托给数据链路层（以太网中的交换机）来实现的。
         *
         * 4.涉及到的三张表分别是
         * （1）交换机中有 MAC 地址表用于映射 MAC 地址和它的端口;
         * ===》
         * MAC 地址表是通过以太网内各节点之间不断通过交换机通信，不断完善起来的。
         *
         * （2）路由器中有路由表用于映射 IP 地址(段)和它的端口;
         * ===》
         * 路由表是各种路由算法 + 人工配置逐步完善起来的。
         * （3）电脑和路由器中都有arp 缓存表用于缓存 IP 和 MAC 地址的映射关系;
         * ===》
         * arp 缓存表是不断通过 arp 协议的请求逐步完善起来的。
         *
         */
    }
}
